package com.winning.util.excelutil.service.impl;

import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.metadata.Sheet;
import com.winning.util.excelutil.common.exception.BaseException;
import com.winning.util.excelutil.excel.ExcelListener;
import com.winning.util.excelutil.excel.ExcelUtil;
import com.winning.util.excelutil.service.ImportService;
import com.winning.util.excelutil.util.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
/*import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;*/
import org.springframework.stereotype.Service;
/*import org.springframework.transaction.annotation.Transactional;*/
import org.springframework.web.multipart.MultipartFile;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @作者： caopengfei
 * @时间： 2020/2/13
 */
@Service
@Slf4j
public class ImportServiceImpl implements ImportService {

/*    @Autowired
    NamedParameterJdbcTemplate namedParameterJdbcTemplate;*/

    @Override
/*    @Transactional*/
    public void importExcel(int updateIndex, MultipartFile file) {
        importExcel2(updateIndex,  file);
    }
     /**
     * @vsts_no：
     * @comment： 导入数据
     * @author： caopengfei
     * @time：  2020/2/14 19:58
     */
    private void importExcel2(int updateIndex, MultipartFile file){
        ExcelListener excelListener = new ExcelListener();
        ExcelReader reader = ExcelUtil.getReader(file,excelListener);
        List<Sheet> sheets  =  reader.getSheets();
        for (Sheet sheet : sheets){
            String sheetName = sheet.getSheetName();
            reader.read(sheet);
            List<Object> datas = excelListener.getDatas();
            //获取数据库字段
            List<String> columns = (List)datas.get(1);

            checkColumn(columns);
            //获取数据

            Map<String,Object>[] params = getParamMaps(datas,columns);
            if(updateIndex > 0){
//                insertOrUpdate();
            }else{
                String sql = createInsertSql(sheetName,columns);
  /*              namedParameterJdbcTemplate.batchUpdate(sql,params);*/
            }

        }
    }

    private void insertOrUpdate(int updateIndex,List<Object> datas){
//        for (int i = 2; i < datas.size(); i++) {
//            List<String> row = (List) datas.get(i);
//            isExists(updateIndex)
//        }
//        if(isExists(updateIndex)){
//
//        }

    }

    /**
    * @vsts_no：
    * @comment： 获取参数集合
    * @author： caopengfei
    * @time：  2020/2/13 19:23
    */
    private Map<String,Object>[] getParamMaps(List<Object> datas,List<String> columns){
        Map<String,Object> [] params = new Map[datas.size()-2];
        for (int i = 2; i < datas.size(); i++) {
            List<String> row = (List)datas.get(i);
            Map<String,Object> param = new HashMap<String,Object>();
            for (int j = 0; j < columns.size(); j++) {
                //如果字段为空则跳过
                if(StringUtils.isEmpty(columns.get(i))){
                    continue;
                }
                String value = null;
                if(row.size() >= (j+1)){
                    value = row.get(j);
                    if(StringUtils.isEmpty(value)){
                        value = null;
                    }
                }
                param.put(columns.get(j),value);
            }
            params[i-2] =param ;
        }
        return params;
    }

    /**
    * @vsts_no：
    * @comment： 获取新增的sql
    * @author： caopengfei
    * @time：  2020/2/13 19:23
    */
    private String createInsertSql(String tableName,List<String> columns){
        StringBuilder insert = new StringBuilder();
        StringBuilder values = new StringBuilder();

        insert.append(" insert into  ").append(tableName).append(" ( ");
        values.append(" values( ");
        //2.遍历所有的字段
        for (String field : columns) {
            //如果字段则拼接
            if(StringUtils.isNotEmpty(field)){
                insert.append(field).append(",");
                values.append(":").append(field).append(",");
            }
        }
        insert.deleteCharAt(insert.length()-1);
        insert.append(") ");
        values.deleteCharAt(values.length()-1);
        values.append(") ");
        insert.append(values);
        return insert.toString();
    }

    /**
    * @vsts_no：
    * @comment： 拼接更新SQL
    * @author： caopengfei
    * @time：  2020/2/15 16:26
    */
    private String createUpdateSql(int updateIndex,String tableName,List<String> columns){
        StringBuilder update = new StringBuilder();
        update.append(" update ").append(tableName).append(" set ");
        //2.遍历所有的字段
        for (int i = updateIndex; i <columns.size() ; i++) {
            String field = columns.get(i);
            update.append(" ").append(field).append("=:").append(field).append(",");
        }
        update.append(createWhere(updateIndex,columns));
        return update.toString();
    }

    /**
    * @vsts_no：
    * @comment： 拼接查询sql
    * @author： caopengfei
    * @time：  2020/2/15 16:26
    */
    private String createSelect(int updateIndex,String tableName,List<String> columns){
        return " select count(1) as count from " + tableName + createWhere(updateIndex, columns);
    }

    private boolean isExists(int updateIndex,List<String> row,List<String> columns,String tableName){
        String querySql = createSelect(updateIndex,tableName,columns);
        Map<String,Object>  params = new HashMap<>();
        for (int i = 0; i <updateIndex ; i++) {
            params.put(columns.get(i),row.get(i));
        }
/*        Map result = namedParameterJdbcTemplate.queryForObject(querySql,params,Map.class);*/
//        Integer.parseInt(result.get("count")+"")>0;
        return true;

    }

    /**
    * @vsts_no：
    * @comment： 拼接where 条件
    * @author： caopengfei
    * @time：  2020/2/15 16:36
    */
    private String createWhere(int updateIndex,List<String> columns){
        StringBuilder where = new StringBuilder();
        where.append(" where ");
        for (int i = 0; i <updateIndex ; i++) {
            String field = columns.get(i);
            where.append(" and ").append(field).append("=:").append(field).append(",");
        }
        return where.toString();
    }

    /**
    * @vsts_no：
    * @comment： 校验字段是否有留白
    * @author： caopengfei
    * @time：  2020/2/14 19:55
    */
    private void checkColumn(List<String> columns){
        boolean lastColumnIsNull = StringUtils.isEmpty(columns.get(columns.size()-1));
        for (int i = (columns.size()-1);i>0;i--){
            String column = columns.get(i);
            //如果第二行的字段列 表格中间空格.
            if((!lastColumnIsNull)&&StringUtils.isEmpty(column)&& i<columns.size()-1){
                throw new BaseException("excel 第一行，第二行不能有间隔空列，请检查");
            }
        }
    }

}
